package com.ftwj.demo.utils.key;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
/**
 * 	根据本机的时间和本机的IP地址，生成在一个局域网段内唯一的ID<br/>
 * 	出于跨数据库平台的考虑，不再使用数据库序列的方式生成ID<br/>
 * 	为减少访问库的次数，与上一版本相比，TimestampID不再提供按照时间排序的功能<br/>
 * @author 齐炜
 * @version 3.0
 */
public class TimestampID {
	/**
	 * 	对数值进行格式化
	 */
	NumberFormat   formatter = null;  
	/**
	 * 	本机IP地址，只保留最后三位，如果不足三位，前面补零<br/>
	 * 	C类IP地址，长度最长为2<sup>8</sup>，用10进制三位即可表示
	 */
	String ip;
	
	/**
	 * 	构造
	 */
	private TimestampID(){
		//格式化时只保留最后两位，如果不足两位，则前面被零
		formatter = NumberFormat.getNumberInstance();
		formatter.setGroupingUsed(false);
		formatter.setMaximumIntegerDigits(3);
		formatter.setMinimumIntegerDigits(3);
		//获得后三位IP
		try {
			String localhost = InetAddress.getLocalHost().toString();
			int index = localhost.lastIndexOf('.');
			localhost = localhost.substring(index+1);
			NumberFormat tempFormat = NumberFormat.getNumberInstance();
			tempFormat.setGroupingUsed(false);
			tempFormat.setMaximumIntegerDigits(3);
			tempFormat.setMinimumIntegerDigits(3);
			ip = tempFormat.format(Integer.parseInt(localhost));
			tempFormat = null;
		} catch (UnknownHostException e) {
			//当发生异常时，IP地址为000
			ip = "000";
		}
	}
	
	/**
	 * ID创建工具的唯一实例
	 */
	
	static TimestampID instance = new TimestampID();
	
	/**
	 * 	获得ID创建工具
	 * @return ID创建工具的唯一实例
	 */
	public synchronized static TimestampID getInstance() {
		return instance;
	}
	/**
	 *	将将前时间转化为毫秒级的字符串<br/>
	 * 	此方法得到的ID，精度较低，因此不建议使用
	 * @return yyyyMMddHHmmssSS格式的时间戳字符串
	 * @deprecated
	 */
	public synchronized String getID(){
		Calendar ca =  Calendar.getInstance();
		SimpleDateFormat format = new SimpleDateFormat("yyMMddHHmmssSS");
		return format.format(ca.getTime());
	}
	
	/**
	 * 	记录本机上次产生的ID的位置
	 */
	int preSeq = 0;
	
	/**
	 * 	获得一个局域网唯一的ID
	 * ID由时间戳+C类地址IP+本地上次生成的序列+两位随机数组合而成
	 * ID长度为25位的字符串
	 * @return 时间戳+C类地址IP+本地上次生成的序列+两位随机数组合而成的字符串
	 */
	public synchronized String getRandomID(){
		preSeq ++;
		preSeq = preSeq % 1000;
		return getID() + ip + formatter.format(preSeq);
	}
	
	public static void main(String[] args){
		System.out.println(TimestampID.getInstance().getRandomID());
	}
}